<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 这是 JavaScript 最基本的继承方式，通过将一个对象的 prototype 设置为另一个对象的实例，实现继承。
        function Parent() {
            this.name = 'parent'
            this.color = [1,2,3,4,5]
        }

        Parent.prototype.say = function () {
            console.log('我是Parent')
        }

        function Child () {
            this.age = 200
        }
        Child.prototype.hi = function () {
            console.log('调用hi')
        }
        Child.prototype = new Parent()
        
        // 修复 Child 的构造函数引用
        // Child.prototype.constructor = Child;

        const child1 = new Child()
        // 调用父类的 say
        child1.say()
        // 修改基本数据
        child1.name = 'child1'

        const child2 = new Child()

        // 基本数据不共享
        console.log(child1.name, child2.name)

        // 调用Child的hi方法
        child1.hi() // 报错不存在，原型链被替换了

        // 修改父类引用数据
        child1.color.push(2)
        console.log(child1.color, child2.color)

        // 特点：
        // 子类通过原型链继承父类的属性和方法。
        // 缺点一 所有实例共享父类的引用属性，如果修改其中一个实例的引用属性，其他实例的引用属性也会受到影响。
        // 缺点二 子类的原型会被父类替换
    </script>
</body>
</html>